// 系统中默认的stdin为全缓冲，缓冲区大小为1024
// 使用setvbuf函数将标准输入stdin设置为无缓冲，然后在屏幕上打印其缓冲类型
// 然后再将setvbuf函数设置为全缓冲，缓冲区大小为512，再次打印其缓冲类型

#include <stdio.h>
#include <stdlib.h>

/*定义缓冲区大小*/
#define SIZE 512

void pr_stdin(const char *, FILE *);

int main(int argc, char *argv[]){
	
	int fd;

	char buf[1];		//设置缓冲区

	// 判断stdin的默认缓冲区
	pr_stdin("stdin", stdin);

	// 使用setvbuf，将stdin设置为无缓冲方式
	fd = setvbuf(stdin, buf, _IONBF, SIZE);
	if(fd != 0){
		perror("setvbuf函数修改stdin缓冲方式失败!\n");
		return -1;
	}
	printf("setvbuf函数修改stdin缓冲方式成功!\n");

	pr_stdin("stdin", stdin);
	printf("stdin的文件描述符为%d\n", fileno(stdin));

	// 将setvbuf函数重新设置为全缓冲，缓冲区大小为512
	fd = setvbuf(stdin, buf, _IOFBF, SIZE);
	if(fd != 0){
		perror("setvbuf函数修改stdin缓冲方式失败!\n");
		return -1;
	}
	printf("setvbuf函数修改stdin缓冲方式成功!\n");

	pr_stdin("stdin", stdin);
	printf("stdin的文件描述符为%d\n", fileno(stdin));

	return 0;

}

void pr_stdin(const char *name, FILE *fp){
	printf("%s的缓冲方式为：", name);

	if(fp->_flags & _IO_UNBUFFERED){
		printf("无缓冲\n");
	}else if(fp->_flags & _IO_LINE_BUF){
		printf("行缓冲\n");
	}else{
		printf("全缓冲\n");
	}

	printf("该缓冲区大小为:%ld\n", fp->_IO_buf_end - fp->_IO_buf_base);

	//return 0;
}
